module WB(icode, enable, rA, rB, Bch, valM_i, valE_i, valP, valC, valM_o, valE_o, dstM, dstE, PC);
input [3:0] icode;
input enable;
input [3:0] rA;
input [3:0] rB;
input Bch;
input [31:0] valM_i;
input [31:0] valE_i;
input [31:0] valP;
input [31:0] valC;
output reg [31:0] valM_o;
output reg [31:0] valE_o;
output reg [3:0] dstM;
output reg [3:0] dstE;
output reg [31:0] PC;

always @(*) begin
	if(enable) begin
		case(icode)
			0, 1, 4: begin
				dstM <= 4'h8;
				dstE <= 4'h8;
				valM_o <= valM_i;
				valE_o <= valE_i;
				PC <= valP;
			end
			2, 3, 6: begin
				dstM <= 4'h8;
				dstE <= rB;
				valM_o <= valM_i;
				valE_o <= valE_i;
				PC <= valP;
			end
			5: begin
				dstM <= rA;
				dstE <= 4'h8;
				valM_o <= valM_i;
				valE_o <= valE_i;
				PC <= valP;
			end
			7: begin
				dstM <= 4'h8;
				dstE <= 4'h8;
				valM_o <= valM_i;
				valE_o <= valE_i;
				PC <= Bch? valC : valP;
			end
			8: begin
				dstM <= 4'h8;
				dstE <= 4'h4;
				valM_o <= valM_i;
				valE_o <= valE_i;
				PC <= valC;
			end
			9: begin
				dstM <= 4'h8;
				dstE <= 4'h4;
				valM_o <= valM_i;
				valE_o <= valE_i;
				PC <= valM_i;
			end
			10: begin
				dstM <= 4'h8;
				dstE <= 4'h4;
				valM_o <= valM_i;
				valE_o <= valE_i;
				PC <= valP;
			end
			10: begin
				dstM <= rA;
				dstE <= 4'h4;
				valM_o <= valM_i;
				valE_o <= valE_i;
				PC <= valP;
			end
		endcase
	end else begin
		dstM <= 4'h8;
		dstE <= 4'h8;
	end
end

endmodule
